home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / dxlib50.zip / MICROSOF.ZIP / EXAMP3.ASM < prev    next >
Assembly Source File  |  1995-02-11  |  3KB  |  72 lines

  1.                .MODEL         LARGE,PASCAL
  2.                .386
  3.  
  4.                INCLUDE        XLIB.INC
  5.  
  6. CSEG           SEGMENT PARA PUBLIC USE16 'CODE'
  7.                ASSUME CS:CSEG, DS:DSEG
  8.  
  9. ;Function to calculate linear address from segment address on stack.
  10. ;Returns linear address in EAX and DX:AX.
  11. LINADR         PROC FAR PUBLIC,
  12.                SEGADR:DWORD                  ;Segment address of variable
  13.                XOR            EAX,EAX        ;Clear high words
  14.                XOR            EDX,EDX
  15.                MOV            AX,WORD PTR SEGADR[2]
  16.                MOV            DX,WORD PTR SEGADR[0]
  17.                SHL            EAX,4         ;Calculate linear address
  18.                ADD            EAX,EDX
  19.                MOV            EDX,EAX
  20.                SHR            EDX,16         ;Return linear address in DX:AX
  21.                RET
  22. LINADR         ENDP
  23.  
  24. ;Structure defining control block for SUMARRAY.
  25. ARRAYDATA      STRUCT
  26.   CONDCODE     DWORD          0              ;Condition code
  27.   N            DWORD          0              ;Number of elements to sum
  28.   ADDRESS      DWORD          0              ;Address of first element
  29.   SUM          DWORD          0              ;Sum of array elements
  30. ARRAYDATA      ENDS
  31.  
  32. ;Real-mode interface to SUMARRAY32.  Segment address of control block having
  33. ;structure ARRAYDATA should be on the stack.
  34. SUMARRAY       PROC FAR PUBLIC,
  35.                CBSEGADR:DWORD                ;Control block segment address
  36.                MOV            EAX,CBSEGADR   ;Will convert to linear address
  37.                PUSH           EAX
  38.                CALL           LINADR         ;Will use linear address in EAX
  39.                PUSHD          OFFSET SUMARRAY32
  40.                CALL           ENTERPM        ;Execute SUMARRAY32 in protected
  41.                RET
  42. SUMARRAY       ENDP
  43.  
  44. CSEG           ENDS
  45.  
  46. TSEG           SEGMENT PARA PUBLIC USE32 'CODE'
  47.                ASSUME CS:TSEG, SS:TSEG, DS:TSEG, ES:TSEG, FS:DSEG, GS:DGROUP
  48.  
  49. ;Sum the elements of a single precision array.  Array parameters are stored
  50. ;in a control block having structure of ARRAYDATA.  The linear address of the
  51. ;control block is contained in EAX.  An error code of -1 is returned in the
  52. ;condition code of the control block if the number of array elements is zero.
  53. ;Observe that this routine will be called with DS = FLATDSEL (flat-model data
  54. ;descriptor).
  55. SUMARRAY32     PROC NEAR
  56.                MOV            EDX,ARRAYDATA.ADDRESS[EAX]    ;Get array address
  57.                MOV            ESI,ARRAYDATA.N[EAX]          ;Get N
  58.                SUB            ESI,1
  59.                JB             NODATA                        ;Error:  N = 0
  60.                FLDZ                                         ;Initialize sum
  61. SUMLOOP:       FADD           DWORD PTR [EDX+4*ESI]
  62.                SUB            ESI,1
  63.                JAE            SUMLOOP
  64.                FSTP           ARRAYDATA.SUM[EAX]            ;Save sum
  65.                RET
  66. NODATA:        MOV            ARRAYDATA.CONDCODE[EAX],-1    ;Record error code
  67.                RET
  68. SUMARRAY32     ENDP
  69.  
  70. TSEG           ENDS
  71.                END
  72.